﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Drawing;
using System.IO;

namespace AccidentCards
{
    class AccidentCard
    {
        static public void CreateAccidentCard(ref Int64 id)
        {
            while (!dbServices.TestDbAccess())
            {
                DialogResult mesRslt = MessageBox.Show("Соединение потеряно.\nЧтобы повторить попытку подключения нажмите 'Повторить' или 'Отмена' для отмены действия.", "Ошибка", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation);
                if (mesRslt == DialogResult.Retry)
                {
                    Application.DoEvents();
                }
                else
                    if (mesRslt == DialogResult.Cancel)
                    {
                        return;
                    }
            }

            //using (SqlConnection connection = new SqlConnection(globalConnectionString))
                try
                {

                    SqlCommand cmd = new SqlCommand("CreateAccidentCard", dbServices.SqlConn);
                    cmd.CommandType = CommandType.StoredProcedure;                    
                    cmd.Connection.Open();
                    Object o = cmd.ExecuteScalar();
                    id = Convert.ToInt64(o);
                }
                catch (SqlException ex)
                {
                    MessageBox.Show("Ошибка, при создании нового события. Код 1: " + ex.ToString());
                    return;

                }
                catch
                {
                    MessageBox.Show("Ошибка, при создании нового события. Код 2.");
                    return;

                }
        }

        public static int UpdateAccidentCardFrontImage(long id, Bitmap image )
        {
            dbServices.Connect();
            var sqlCmd = new SqlCommand("UpdateAccidentCardFrontImage", dbServices.SqlConn);

            sqlCmd.CommandType = CommandType.StoredProcedure;

            sqlCmd.Parameters.Add("@id", SqlDbType.BigInt, 4);
            sqlCmd.Parameters.Add("@frontImage", SqlDbType.VarBinary);
            

            sqlCmd.Parameters["@id"].Value = id;

            
            MemoryStream ms = new MemoryStream();
            image.Save( ms, System.Drawing.Imaging.ImageFormat.Jpeg);

            sqlCmd.Parameters["@frontImage"].Value = ms.ToArray();
            

            try
            {
                sqlCmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return -1;
            }
            finally
            {
                sqlCmd.Dispose();
                dbServices.Close();
            }
            return 0;
        }

        public static int UpdateAccidentCardBackImage(long id, Bitmap image)
        {
            dbServices.Connect();
            var sqlCmd = new SqlCommand("UpdateAccidentCardBackImage", dbServices.SqlConn);

            sqlCmd.CommandType = CommandType.StoredProcedure;

            sqlCmd.Parameters.Add("@id", SqlDbType.BigInt, 4);
            sqlCmd.Parameters.Add("@backImage", SqlDbType.VarBinary);


            sqlCmd.Parameters["@id"].Value = id;


            MemoryStream ms = new MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

            sqlCmd.Parameters["@backImage"].Value = ms.ToArray();


            try
            {
                sqlCmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return -1;
            }
            finally
            {
                sqlCmd.Dispose();
                dbServices.Close();
            }
            return 0;
        }



        public static int UpdateAccidentCard(            
                                            long id,
                                            int regionCode,
                                            DateTime accidentDateTime,        
                                            int operationType,
                                            int cardRegistrationNumber,
                                            int checksum,
                                            int cardReportNumber,
                                            
                                            int streetName,
                                            int streetCategory,
                                            string house,
                                            int distanceM,
                                            int distanceKm,
                                            int centerOfPopulationName,
                                            int centerOfPopulationStatus,
                                            int roadCategory,
                                            int region,
                                            int roadName,
                                            int roadValue,
                                            
                                            int participentAmmount,
                                            int vehicleAmmount,
                                            int accidentScheme,
                                            int accidentType,

                                            string additionalInfo,
                                            
                                            int centerStripWidth,
                                            int sidewalkWidth,
                                            int roadsideWidth,
                                            int roadWidth,
                                            int engineeringStructure,
                                            int planElement,

                                            int coverType,
                                            int roadState,
                                            int lightType,
                                            int whetherType,
                                            int roadCondition )
        {
            dbServices.Connect();
            var sqlCmd = new SqlCommand("UpdateAccidentCard", dbServices.SqlConn);

            sqlCmd.CommandType = CommandType.StoredProcedure;

            sqlCmd.Parameters.Add("@id", SqlDbType.BigInt, 4);
            sqlCmd.Parameters.Add("@regionCode", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@accidentDateTime", SqlDbType.DateTime2, 8);      
            sqlCmd.Parameters.Add("@operationType", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@cardRegistrationNumber", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@checksum", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@cardReportNumber", SqlDbType.Int, 4);            
            sqlCmd.Parameters.Add("@streetName", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@streetCategory", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@house", SqlDbType.NVarChar, 10);
            sqlCmd.Parameters.Add("@distanceM", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@distanceKm", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@centerOfPopulationName", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@centerOfPopulationStatus", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@roadCategory", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@region", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@roadName", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@roadValue", SqlDbType.Int, 4);            
            sqlCmd.Parameters.Add("@participentAmmount", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@vehicleAmmount", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@accidentScheme", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@accidentType", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@additionalInfo", SqlDbType.NVarChar, 1024);            
            sqlCmd.Parameters.Add("@centerStripWidth", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@sidewalkWidth", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@roadsideWidth", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@roadWidth", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@engineeringStructure", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@planElement", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@coverType", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@roadState", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@lightType", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@whetherType", SqlDbType.Int, 4);
            sqlCmd.Parameters.Add("@roadCondition", SqlDbType.Int, 4);

            sqlCmd.Parameters["@id"].Value = id;
            sqlCmd.Parameters["@regionCode"].Value = regionCode;
            sqlCmd.Parameters["@accidentDateTime"].Value = accidentDateTime;
            sqlCmd.Parameters["@operationType"].Value = operationType;
            sqlCmd.Parameters["@cardRegistrationNumber"].Value = cardRegistrationNumber;
            sqlCmd.Parameters["@checksum"].Value = checksum;
            sqlCmd.Parameters["@cardReportNumber"].Value = cardReportNumber;
            sqlCmd.Parameters["@streetName"].Value = streetName;
            sqlCmd.Parameters["@streetCategory"].Value = streetCategory;
            sqlCmd.Parameters["@house"].Value = house;
            sqlCmd.Parameters["@distanceM"].Value = distanceM;
            sqlCmd.Parameters["@distanceKm"].Value = distanceKm;
            sqlCmd.Parameters["@centerOfPopulationName"].Value = centerOfPopulationName;
            sqlCmd.Parameters["@centerOfPopulationStatus"].Value = centerOfPopulationStatus;
            sqlCmd.Parameters["@roadCategory"].Value = roadCategory;
            sqlCmd.Parameters["@region"].Value = region;
            sqlCmd.Parameters["@roadName"].Value = roadName;
            sqlCmd.Parameters["@roadValue"].Value = roadValue;
            sqlCmd.Parameters["@participentAmmount"].Value = participentAmmount;
            sqlCmd.Parameters["@vehicleAmmount"].Value = vehicleAmmount;
            sqlCmd.Parameters["@accidentScheme"].Value = accidentScheme;
            sqlCmd.Parameters["@accidentType"].Value = accidentType;
            sqlCmd.Parameters["@additionalInfo"].Value = additionalInfo;
            sqlCmd.Parameters["@centerStripWidth"].Value = centerStripWidth;
            sqlCmd.Parameters["@sidewalkWidth"].Value = sidewalkWidth;
            sqlCmd.Parameters["@roadsideWidth"].Value = roadsideWidth;
            sqlCmd.Parameters["@roadWidth"].Value = roadWidth;
            sqlCmd.Parameters["@engineeringStructure"].Value = engineeringStructure;
            sqlCmd.Parameters["@planElement"].Value = planElement;
            sqlCmd.Parameters["@coverType"].Value = coverType;
            sqlCmd.Parameters["@roadState"].Value = roadState;
            sqlCmd.Parameters["@lightType"].Value = lightType;
            sqlCmd.Parameters["@whetherType"].Value = whetherType;
            sqlCmd.Parameters["@roadCondition"].Value = roadCondition;

            try
            {
                sqlCmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return -1;
            }
            finally
            {
                sqlCmd.Dispose();
                dbServices.Close();
            }
            return 0;
        }

        /** @fn DataTable GetAccidentCardById(int acId)
         * @brief Получить информацию о ДТП
         * @param[in] acId - Идентификатор карточки ДТП
         * @return Возвращает информацию о ДТП
         */
        public static DataTable GetAccidentCardInfoById(long acId)
        {
            var result = new DataTable("AccidentCardInfo");
            dbServices.Connect();
            var sqlAdapter = new SqlDataAdapter("GetAccidentCardInfoByID", dbServices.SqlConn);
            sqlAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            sqlAdapter.SelectCommand.Parameters.Add("@AccidentCardID", SqlDbType.BigInt, 4);
            sqlAdapter.SelectCommand.Parameters["@AccidentCardID"].Value = acId;
            try
            {
                sqlAdapter.Fill(result);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                sqlAdapter.Dispose();
                dbServices.Close();
            }
            return result;
        }

        /** @fn DataTable GetFrontImage(int acId)
        * @brief Получить изображение лицевой стороны
        * @param[in] acId - Идентификатор карточки ДТП
        * @return Возвращает изображение лицевой стороны
        */
        public static Bitmap GetFrontImage(long acId)
        {
            //Получить информацию об экипаже по идентификатору

            var dtResult = new DataTable("AccidentCardInfo");
            Bitmap result = null;
            dbServices.Connect();
            var sqlAdapter = new SqlDataAdapter("GetFrontImage", dbServices.SqlConn);
            sqlAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            sqlAdapter.SelectCommand.Parameters.Add("@id", SqlDbType.BigInt, 4);
            sqlAdapter.SelectCommand.Parameters["@id"].Value = acId;
            try
            {
                //sqlAdapter.Fill(dtResult);
                byte [] buffer = (byte[])sqlAdapter.SelectCommand.ExecuteScalar();

                MemoryStream myStream = new MemoryStream();
                myStream.Write( buffer, 0, buffer.Length );                

                result = new Bitmap(myStream);                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                sqlAdapter.Dispose();
                dbServices.Close();
            }
            return result;
        }

        /** @fn DataTable GetBackImage(int acId)
      * @brief Получить изображение обратной стороны
      * @param[in] acId - Идентификатор карточки ДТП
      * @return Возвращает изображение обратной стороны
      */
        public static Bitmap GetBackImage(long acId)
        {           
            
            Bitmap result = null;
            dbServices.Connect();
            var sqlAdapter = new SqlDataAdapter("GetBackImage", dbServices.SqlConn);
            sqlAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            sqlAdapter.SelectCommand.Parameters.Add("@id", SqlDbType.BigInt, 4);
            sqlAdapter.SelectCommand.Parameters["@id"].Value = acId;
            try
            {
                //sqlAdapter.Fill(dtResult);
                byte[] buffer = (byte[])sqlAdapter.SelectCommand.ExecuteScalar();

                MemoryStream myStream = new MemoryStream();
                myStream.Write(buffer, 0, buffer.Length);

                result = new Bitmap(myStream);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                sqlAdapter.Dispose();
                dbServices.Close();
            }
            return result;
        }
    }
}
